// 封装 axios 对象
import axios from 'axios'
// 导入 store
import store from '../store/index.js'
// 导入 json-bigint
import JSONBigInt from 'json-bigint'

// 创建一个 axios 实例
const instance = axios.create({
  baseURL: 'http://ttapi.research.itcast.cn/app/v1_0/',
  // transformResponse：这个配置会在服务器返回数据给 axios 时起作用
  transformResponse: [
    function (data) {
      try {
        // data: 就是服务器返回给 axios 的数据（JSON 格式的字符串）
        return JSONBigInt.parse(data)
      } catch (error) {
        return data
      }
    }
  ]
})

// 再创建一个 axios 实例，来更新 token
const instance2 = axios.create({
  baseURL: 'http://ttapi.research.itcast.cn/app/v1_0/'
})

// 设置拦截器
// 请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 判断 store 中是否存在 token，如果存在将 token 添加到请求头中，如果不存在，不用理会
    // 1.0 得到 token
    var token = store.state.userInfo.token
    // 2.0 判断 token 是否存在
    if (token) {
      // 添加到请求头中
      config.headers.Authorization = 'Bearer ' + token
    }
    return config
  },
  function (error) {
    return Promise.reject(error)
  }
)
// 响应拦截器
instance.interceptors.response.use(
  function (response) { // 响应成功的回调函数
    return response
  },
  async function (error) { // 响应失败的回调函数
    console.log('-------------------响应拦截器----------------------')
    // 得到错误的状态
    var status = error.response.status
    // 判断状态: token 过期
    if (status === 401) {
      // 由于 token 过期，应该将 refresh_token 发送到服务器，得到新的 token
      // 1.0 得到 refresh_token
      var refreshtoken = store.state.userInfo.refresh_token
      // 2.0 将 refreshtoken 提交到服务器得到新的 token
      // 借助 axios 发送请求
      var res = await instance2({
        url: '/authorizations',
        method: 'PUT',
        headers: {
          Authorization: `Bearer ${refreshtoken}`
        }
      })
      // 得到更新后的 token
      var newToken = res.data.data.token
      // 用新的 token 覆盖过期的 token
      store.commit('setUserInfo', {
        token: newToken,
        refresh_token: refreshtoken
      })
      // 重新发送未完成的请求,并且将接收到的结果返回给外界
      return instance(error.config)
    }
    console.log('-------------------响应拦截器----------------------')
    return Promise.reject(error)
  }
)

// 将对象暴露出去
export default instance
